package com.xuanwei.core.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.google.common.collect.Lists;
import com.xuanwei.core.entity.param.Comment;
import com.xuanwei.core.entity.vo.*;
import com.xuanwei.dao.Do.OrderDo;
import com.xuanwei.dao.entity.XwOrder;

import java.time.LocalDate;
import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author mjy
 * @since 2019-07-11
 */
public interface IXwOrderService extends IService<XwOrder> {

    /**
     * 获取购物车跳转订单的数据
     *
     * @param ids ID集合
     * @return 列表
     */
    PayOrderVo getOrderData(List<Integer> ids, Integer userId, Integer couponId, Integer addressId);


    /**
     * 获取直接跳转订单的数据
     *
     * @return 数据
     */
    PayOrderVo getOrderData(Integer skuId, Integer count, Integer userId, Integer couponId, Integer addressId);

    /**
     * 生成订单(从购物车)
     *
     * @param ids       id集合
     * @param addressId 地址ID
     * @param remark    备注
     * @param couponId  优惠券ID
     * @param userId    用户ID
     */
    XwOrder generateOrder(List<Integer> ids, Integer addressId, String remark, Integer couponId, Integer userId);

    /**
     * 生成订单(直接)
     *
     * @param skuId     skuID
     * @param count     数量
     * @param addressId 地址ID
     * @param remark    备注
     * @param couponId  优惠券ＩＤ
     * @param userId    　用户ID
     */
    XwOrder generateOrder(Integer skuId, Integer count, Integer addressId, String remark, Integer couponId, Integer userId);

    /**
     * 订单支付成功
     *
     * @param orderNo 订单编号
     */
    void orderSuccess(String orderNo);

    /**
     * 订单退款成功
     *
     * @param orderNo 订单编号
     */
    void orderRefundSuccess(String orderNo);


    /**
     * 订单关闭
     *
     * @param orderId 订单ID
     */
    void orderClose(Integer orderId, String reason);

    /**
     * 用户删除订单
     *
     * @param orderId 订单ID
     */
    void orderDelete(Integer orderId);

    /**
     * 查询用户订单列表
     *
     * @param userId 用户ID
     * @param type   类型  0待付款 1待发货 2待收货 3待评价  6售后
     * @return 数据
     */
    List<OrderVo> findUserOrder(Integer userId, Integer type, Page<XwOrder> page);

    /**
     * 查询售后的订单
     *
     * @param userId 用户Id
     * @param page   分页
     * @return 集合
     */
    List<OrderVo> findUserRefund(Integer userId, Page<XwOrder> page);

    /**
     * 订单详情
     *
     * @param orderId 订单ID
     * @return 数据
     */
    OrderDetailVo detail(Integer orderId);

    /**
     * 用户点击收货
     *
     * @param orderId 订单ID
     */
    void receive(Integer orderId, Integer userId);

    /**
     * 用户评论
     *
     * @param items   comment
     * @param orderId 订单ID
     * @param userId  用户ID
     */
    void comment(List<Comment.CommentItem> items, Integer orderId, Integer userId);

    /**
     * 用户申请退款
     *
     * @param orderId 订单ID
     * @param reason  原因
     */
    void applyRefund(Integer orderId, String reason);

    /**
     * 查询退款详情
     *
     * @param id 订单ID
     * @return 数据
     */
    RefundDetail findRefundDetail(Integer id);

    /**
     * 再次申请
     *
     * @param orderId 订单ID
     */
    void continueRefund(Integer orderId);

    /**
     * 用户继续订单
     *
     * @param orderId 订单ID
     */
    void goOnOrder(Integer orderId);

    /**
     * 商家订单列表
     *
     * @param type         类型
     * @param orderNo      订单编号
     * @param nickname     用户名称
     * @param receiveName  收货姓名
     * @param receivePhone 收货电话
     * @param startTime    开始时间
     * @param endTime      结束时间
     * @param page         分页
     */
    Page<OrderListVo> businessOrderList(Integer type, String orderNo,
                                        String nickname, String receiveName,
                                        String receivePhone, LocalDate startTime,
                                        LocalDate endTime, Page<OrderDo> page);


    /**
     * 商家订单列表
     *
     * @param refundType         类型
     * @param orderNo      订单编号
     * @param nickname     用户名称
     * @param receiveName  收货姓名
     * @param receivePhone 收货电话
     * @param startTime    开始时间
     * @param endTime      结束时间
     * @param page         分页
     */
    Page<OrderListVo> refundOrderList(Integer refundType, String orderNo,
                                        String nickname, String receiveName,
                                        String receivePhone, LocalDate startTime,
                                        LocalDate endTime, Page<OrderDo> page);

    /**
     * 发货
     *
     * @param orderId   订单ID
     * @param courierNo 快递单号
     * @param companyId 快递公司
     */
    void send(Integer orderId, Integer companyId, String courierNo);

    /**
     * 拒绝退款
     *
     * @param orderId 订单ID
     * @param reason  原因
     */
    void handleReject(Integer orderId, String reason);


    /**
     * 同意退款
     *
     * @param orderId 订单ID
     */
    void handleAgree(Integer orderId);


    /**
     * 查看物流信息
     *
     * @param orderId 订单ID
     * @return 物流信息
     */
    CourierInfoVo findCourierInfo(Integer orderId);

    /**
     * 查询订单数量
     *
     * @param userId 用户ID
     * @return 数据
     */
    OrderCountVo findOrderCount(Integer userId);

    /**
     * 查询评论订单
     *
     * @param id ID
     * @return 数据
     */
    OrderCommentVo findOrderComment(Integer id);
}
